#include "../include/kernel.h"
#include "../include/syscalls.h"
#include "../include/kasm.h"
#include "../include/defs.h"
#include "../include/int.h"
#include "../include/kc.h"
#include "../include/strings.h"
#include "../include/driverVideo.h"

#define CRTC 0x3D4
#define BAJA 0x0F
#define ALTA 0x0E 

extern buf * fileDesc[MAXFILES];
int cursor;
/***************************************************************
*inicializado
*
* setea los parametros basicos para el correcto funcionamiento
* del video
****************************************************************/
void inicializarVideo(void)
{	
      print("Inicializando video ...\n\0");
    /*cargo el buffer de video*/
	bufVid.buf = bufVideo;
	bufVid.offset = 0;
	bufVid.siguiente = 0;
	bufVid.size = BUFVID;
	cursor = 0;
	//iniciarCursor(cursor);
	
/*Cargo la posicion donde se mapea la pantalla*/	
	video = (char *) POSVIDEO;
      print("Video inicializado correctamente\n\0");
}

/***************************************************************
*movSreen
*
* Mueve la pantalla cuando , se lleno el buffer de video
****************************************************************/
void movScreen(void){
    if((fileDesc[1]->siguiente += MAXCOL) == BUFVID){
	fileDesc[1]->siguiente = 0;
    }
    fileDesc[1]->offset = fileDesc[1]->siguiente;
    refresh();
 }
void refresh(void){
    for(tickpos = 0; tickpos < (SCREEN - MAXCOL); tickpos++){
	
     	    video[tickpos]=fileDesc[1]->buf[(fileDesc[1]->offset)++];
	     if(fileDesc[1]->offset == fileDesc[1]->size)
	      fileDesc[1]->offset = 0;
	      
    }

}
void putCharVideo(char car){
  
	if(tickpos == SCREEN){
	  //llamo a rutina de scroll
	    k_clear_screen();
	    movScreen();
	  }
	    video[tickpos++]=car;
	    video[tickpos++]=WHITE_TXT;
	    cursor ++;
	    setCursorPosi(tickpos/2);
}

void isEnter(void){
int trim;
char space = ' ';
   while(fileDesc[1]->offset % MAXCOL != 0){
	write(1,&space,1);
    }
    
}
void isBksp(void){
  char space = ' ';
  if(tickpos >= 2)
  {
    tickpos -=2;
    fileDesc[1]->offset-=2;
    write(1,&space,1);
    tickpos -=2;
    fileDesc[1]->offset-=2;
    setCursorPosi(tickpos/2);
  }
}
void resetVideo(void){
  tickpos = 0;
  fileDesc[1]->offset = 0;
  fileDesc[1]->siguiente = 0;
  
}

void setCursorPosi(int actual)
{
   _outport(CRTC,BAJA);
   _outport(0x3d5,actual &0x00FF);
   _outport(CRTC,ALTA);
   _outport(0x3d5,actual >>8);
}

/***************************************************************
*k_clear_screen
*
* Borra la pantalla en modo texto color.
****************************************************************/

void k_clear_screen() 
{
	char *vidmem = (char *) 0xb8000;
	unsigned int i=0;
	while(i < (80*25*2))
	{
		vidmem[i]=' ';
		i++;
		vidmem[i]=WHITE_TXT;
		i++;
	}
}

